/*
 * 
 * 
 * 
 */
package com.hboxs.asl.dao;

import com.hboxs.asl.Page;
import com.hboxs.asl.Pageable;
import com.hboxs.asl.entity.Category;
import com.hboxs.asl.entity.Member;

import java.util.Date;
import java.util.List;

/**
 * Dao - 会员
 */
public interface MemberDao extends BaseDao<Member, Long> {

    /**
     * 通过token查找Member
     *
     * @param token
     * @return
     */
    Member findByToken(String token);

    /**
     * 通过token查找Member
     * 不验证日期
     *
     * @param token
     * @return
     */
    Member findByToken2(String token);

    /**
     * 根据clientId查找会员
     *
     * @param clientId
     * @return
     */
    Member findByClientId(String clientId);

    /**
     * 根据推荐码查找会员
     *
     * @param code
     * @return
     */
    Member findByCode(String code);

    /**
     * 判断用户名是否存在
     *
     * @param username 用户名(忽略大小写)
     * @return 用户名是否存在
     */
    boolean usernameExists(String username);

    /**
     * 判断E-mail是否存在
     *
     * @param email E-mail(忽略大小写)
     * @return E-mail是否存在
     */
    boolean emailExists(String email);

    /**
     * 判断手机号码是否存在
     *
     * @param phone 手机号码
     * @return E-mail是否存在
     */
    boolean phoneExists(String phone);

    /**
     * 根据用户名查找会员
     *
     * @param username 用户名(忽略大小写)
     * @return 会员，若不存在则返回null
     */
    Member findByUsername(String username);

    /**
     * 根据E-mail查找会员
     *
     * @param email E-mail(忽略大小写)
     * @return 会员，若不存在则返回null
     */
    List<Member> findListByEmail(String email);

    /**
     * 根据clientId查找会员
     * @param clientId
     * @return
     */
    List<Member> findListByClientId(String clientId);

    /**
     * 查找会员消费信息
     *
     * @param beginDate 起始日期
     * @param endDate   结束日期
     * @param count     数量
     * @return 会员消费信息
     */
    List<Object[]> findPurchaseList(Date beginDate, Date endDate, Integer count);

    /**
     * 获取所有老师
     * @param teacher
     * @return
     */
    List<Member> findALLTeacher(Member.Type teacher);

    /**
     * 根据分类获取老师
     * @param pageable
     * @param category
     * @return
     */
    Page<Member> findTeacherByCategory( Pageable pageable , Category category);

    /**
     * 搜索老师
     * @param pageable
     * @param name
     * @return
     */
    Page<Member> searchTeacherPage(Pageable pageable, String name);
}